package com.mapper;

import com.entity.Order;
import com.entity.OrderItem;
import com.entity.Product;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 *@InterfaceName OrderMapper
 *@Description  订单持久层接口
 *@Author Kx
 *@Date 2025/5/27 19:15
 *@Version 1.0
 */
public interface OrderMapper {
    /**
     * @author: kx
     * @date: 2025/5/27 19:32
     * @param order : 订单信息
     * @description: 添加订单信息
    */
    void addOrder(@Param("order") Order order);

    /**
     * @author: kx
     * @date: 2025/5/27 19:49
     * @param orderItem : 订单商品项信息
     * @description: 添加订单商品项信息
    */
    void addOrderItem(OrderItem orderItem);

    /**
     * @author: kx
     * @date: 2025/5/28 9:10
     * @param userId : 用户ID
     * @return java.util.List<com.dto.OrderDto>
     * @description: 根据用户ID查询该用户购物车信息
    */
    List<OrderItem> findByUserId(@Param("userId") Integer userId);

    /**
     * @author: kx
     * @date: 2025/5/29 21:00
     * @param userId : 用户ID
     * @param productId : 商品ID
     * @return com.entity.OrderItem
     * @description: 根据用户id和商品id查询订单商品信息
    */
    OrderItem findByUserIdAndProductId(@Param("userId") Integer userId, @Param("productId") Integer productId);

    /**
     * @author: kx
     * @date: 2025/6/9 19:36
     * @param userId : 用户ID
     * @param productId : 商品ID
     * @return java.util.List<com.entity.OrderItem>
     * @description: 根据用户id和商品id查询订单商品信息(获取最近购买此商品的订单信息)
    */
    Order findLatestOrderForUserAndProduct(@Param("userId") Integer userId, @Param("productId") Integer productId);

    /**
     * @author: kx
     * @date: 2025/5/28 10:50
     * @param orderItem : 订单商品项
     * @description: 修改订单商品项
    */
    void updateOrderItem(OrderItem orderItem);

    /**
     * @author: kx
     * @date: 2025/5/28 11:06
     * @param itemId : 订单商品项ID
     * @description: 删除订单商品项
    */
    void deleteOrderItem(@Param("itemId") Integer itemId);

    /**
     * @author: kx
     * @date: 2025/5/28 15:04
     * @param orderStatus : 订单状态
     * @param userId : 用户ID
     * @return java.util.List<com.entity.Order>
     * @description: 根据订单状态和用户编号查询订单信息
    */
    List<Order> findByOrderStatus(@Param("orderStatus") Integer orderStatus, @Param("userId") Integer userId);

    /**
     * @author: kx
     * @date: 2025/5/28 11:48
     * @param orderId : 订单编号
     * @return java.util.List<com.entity.OrderItem>
     * @description: 根据订单编号查询订单商品项
    */
    List<OrderItem> findByOrderId(@Param("orderId") String orderId);

    /**
     * @author: kx
     * @date: 2025/5/28 16:00
     * param order : 订单信息
     * @description: 修改订单状态
    */
    void updateOrderStatus(@Param("order") Order order);

    /**
     * @author: kx
     * @date: 2025/6/4 8:56
     * @param orderId : 订单编号
     * @return com.entity.Order
     * @description: 根据订单编号查询订单信息
    */
    Order getOrderById(@Param("orderId") String orderId);


    /**
     * @author: kx
     * @date: 2025/6/6 15:36
     * @param userId : 用户编号
     * @return java.util.List<java.lang.Integer>
     * @description: 查询该用户最近购买的商品编号
    */
    List<Integer> findRecentPurchasedProductIds(@Param("userId") Integer userId);

    /**
     * @author: kx
     * @date: 2025/6/11 9:09
     * @param yearMonth : 年份和月份
     * @return java.math.BigDecimal
     * @description: 根据年月份查询该年月份的销售额
    */
    BigDecimal findSalesByYearAndMonth(@Param("yearMonth") String yearMonth);

    /**
     * @author: kx
     * @date: 2025/6/11 20:17
     * @param year : 年份
     * @return java.util.Map<java.lang.Integer,java.math.BigDecimal>
     * @description: 根据年份查询该年份的各月份销售额
    */
    @MapKey("month")
    Map<Integer, BigDecimal> getMonthlySalesByYear(@Param("year") String year);


    /**
     * @author: kx
     * @date: 2025/6/16 15:34
     * @param pageNum : 页码
     * @param pageSize : 每页显示的记录数
     * @return java.util.List<com.entity.Order>
     * @description: 分页查询所有订单信息
    */
    List<Order> findAllOrders(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * @author: kx
     * @date: 2025/6/19 15:31
     * @param userKeyword : 用户名关键字
     * @param pageNum : 页码
     * @param pageSize : 每页显示的记录数
     * @return java.util.List<com.entity.Order>
     * @description: 根据用户名关键字分页查询订单信息
    */
    List<Order> searchOrdersByUserKeyword(@Param("userKeyword") String userKeyword, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}
